import glob
import os
import datetime
import time

from src.utils.config import logger
from src.utils.dingding_message import dingding_messager
from src.utils.dingding_b2bfund_message import dingding_b2b_messager

def check_conflict_file(directory, file_name, file_suffix=None, is_remove_old_file=False):
    """
    1. 检查目录是否存在，不存在时创建新目录
    2. 检查文件是否存在，如果存在则将文件重命名
    :param directory: 路径
    :param file_name: 文件名
    :param file_suffix: 文件存在时，给文件增加后缀名，如果为None，则设定为当前时间
    :param is_remove_old_file: 是否删除旧文件
    :return:
    """
    if not os.path.exists(directory):
        logger.info('make new directory@{}'.format(directory))
        os.makedirs(directory, exist_ok=True)

    checking_file = os.path.join(directory, file_name)
    if os.path.exists(checking_file):
        if is_remove_old_file:
            os.remove(checking_file)
            logger.info('remove {}'.format(checking_file))
        else:
            if file_suffix is None:
                file_suffix = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
            new_file_name = os.path.join(directory, file_name + '.' + file_suffix)
            logger.info('rename {} to {}'.format(checking_file, new_file_name))
            os.rename(checking_file, new_file_name)

def check_dir(directory):
    """
    1. 检查目录是否存在，不存在时创建新目录
    2. 检查文件是否存在，如果存在则将文件重命名
    :param directory: 路径
    :param file_name: 文件名
    :param file_suffix: 文件存在时，给文件增加后缀名，如果为None，则设定为当前时间
    :param is_remove_old_file: 是否删除旧文件
    :return:
    """
    if not os.path.exists(directory):
        logger.info('make new directory@{}'.format(directory))
        os.makedirs(directory, exist_ok=True)


def check_date_str(d):
    """
    检期变量的类型，如果是字符串，则转为日期类型
    :param d: 日期
    :return:
    """
    if isinstance(d, str):
        d = datetime.datetime.strptime(d, '%Y-%m-%d')
    return d

def check_dated_str(d):
    """
    检期变量的类型，如果是字符串，则转为日期类型
    :param d: 日期
    :return:
    """
    if isinstance(d, str):
        d = datetime.datetime.strptime(d, '%Y-%m-%d')
    return d.date()

def format_date_string(d):
    """
    将日期format成yyyy-mm-dd格式字符串
    :param d: 日期
    :return:
    """
    d = check_date_str(d)
    return d.strftime('%Y-%m-%d')

def format_date(d):
    """
    将日期format成yyyy-mm-dd格式字符串
    :param d: 日期
    :return:
    """
    d = check_date_str(d)
    return datetime.date(d.year,d.month,d.day)

def get_today():
    """
    返回当天日期
    :return:
    """
    return datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)


def get_file_create_date(file_name):
    """
    获取文件创建时间
    :param file_name:
    :return:
    """
    # 使用mtime, ctime在Unix平台会返回最后元数据次更改时间，而不是实际的创建时间
    create_timestamp = os.path.getmtime(file_name)
    create_time_struct = time.localtime(create_timestamp)
    return check_date_str(time.strftime('%Y-%m-%d', create_time_struct))


def process_model_file_date_mapping(file_pattern):
    """
    遍历模型，获取模型与日期映射
    :param file_pattern: 文件模式
    :return:
    """
    files = glob.glob(file_pattern)
    file_time_mapping = {}
    for f in files:
        create_date = get_file_create_date(f)
        file_time_mapping[format_date_string(create_date)] = f

    return file_time_mapping


def sending_exception(msg):
    """
    记录CRITICAL日志，并且发送钉钉告警
    :return:
    """
    logger.critical(msg)
    dingding_messager.send_message(msg)

def sending_b2b_exception(msg):
    """
    记录CRITICAL日志，并且发送钉钉告警
    :return:
    """
    logger.critical(msg)
    dingding_b2b_messager.send_message(msg)
